package com.blog.cmrpersonalblog.dto.announcement.response;

import lombok.Data;
import java.time.LocalDateTime;

/**
 * 公告响应DTO
 */
@Data
public class AnnouncementResponse {

    /**
     * 公告ID
     */
    private Long id;

    /**
     * 公告标题
     */
    private String title;

    /**
     * 公告内容
     */
    private String content;

    /**
     * 公告类型 1-系统公告 2-活动公告 3-维护公告 4-其他
     */
    private Integer type;

    /**
     * 公告类型名称
     */
    private String typeName;

    /**
     * 公告级别 1-普通 2-重要 3-紧急
     */
    private Integer level;

    /**
     * 公告级别名称
     */
    private String levelName;

    /**
     * 公告状态 0-草稿 1-已发布 2-已过期 3-已删除
     */
    private Integer status;

    /**
     * 公告状态名称
     */
    private String statusName;

    /**
     * 是否置顶 0-否 1-是
     */
    private Integer isTop;

    /**
     * 是否弹窗显示 0-否 1-是
     */
    private Integer isPopup;

    /**
     * 目标受众
     */
    private String targetAudience;

    /**
     * 目标受众名称
     */
    private String targetAudienceName;

    /**
     * 发布时间
     */
    private LocalDateTime publishTime;

    /**
     * 过期时间
     */
    private LocalDateTime expireTime;

    /**
     * 查看次数
     */
    private Integer viewCount;

    /**
     * 创建人ID
     */
    private Long creatorId;

    /**
     * 创建人姓名
     */
    private String creatorName;

    /**
     * 更新人ID
     */
    private Long updaterId;

    /**
     * 更新人姓名
     */
    private String updaterName;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 是否已过期
     */
    private Boolean expired;

    /**
     * 是否已读（仅在用户查询时返回）
     */
    private Boolean read;

    /**
     * 剩余有效天数（如果有过期时间）
     */
    private Long remainingDays;

    /**
     * 获取公告类型名称
     */
    public String getTypeName() {
        if (type == null) return "";
        return switch (type) {
            case 1 -> "系统公告";
            case 2 -> "活动公告";
            case 3 -> "维护公告";
            case 4 -> "其他";
            default -> "未知";
        };
    }

    /**
     * 获取公告级别名称
     */
    public String getLevelName() {
        if (level == null) return "";
        return switch (level) {
            case 1 -> "普通";
            case 2 -> "重要";
            case 3 -> "紧急";
            default -> "未知";
        };
    }

    /**
     * 获取公告状态名称
     */
    public String getStatusName() {
        if (status == null) return "";
        return switch (status) {
            case 0 -> "草稿";
            case 1 -> "已发布";
            case 2 -> "已过期";
            case 3 -> "已删除";
            default -> "未知";
        };
    }

    /**
     * 获取目标受众名称
     */
    public String getTargetAudienceName() {
        if (targetAudience == null) return "";
        return switch (targetAudience) {
            case "all" -> "所有用户";
            case "admin" -> "管理员";
            case "user" -> "普通用户";
            default -> "未知";
        };
    }

    /**
     * 计算是否已过期
     */
    public Boolean getExpired() {
        if (expireTime == null) {
            return false;
        }
        return LocalDateTime.now().isAfter(expireTime);
    }

    /**
     * 计算剩余有效天数
     */
    public Long getRemainingDays() {
        if (expireTime == null) {
            return null;
        }
        LocalDateTime now = LocalDateTime.now();
        if (now.isAfter(expireTime)) {
            return 0L;
        }
        return java.time.Duration.between(now, expireTime).toDays();
    }
}
